# 
# To change this template, choose Tools | Templates
# and open the template in the editor.
 

class CalculaBonificacion
  def initialize
    
  end

  def calcular
    convenios = convenios_vigentes(Time.now, Convenio::CENTRO_CONSUMO)
    convenios.each do |c|
      puts "Obteniendo facturas sin procesar para convenio #{c.consecutivo}"
      facturas = facturas_sin_procesar(c.participante_id, c.fecha_inicio, c.fecha_termino)
      facturas.each do |f|
        puts "Obteniendo detalles para factura #{f.referencia}"
        detalles = f.detalle_facturas
        detalles.each do |d|
          producto = Producto.find(d.producto_id)
          puts "Obteniendo detalle de producto #{producto.descripcion}"
          if pertenece_a_marca_bonificable?(producto, c.bonificaciones)
            puts "Producto bonificable: #{producto.descripcion}"
            
            # TODO: definir sobre cual precio se tiene que hacer el calculo             
            if producto.precio_venta != 0.0
              bp = porcentaje_bonificacion(c.bonificaciones, producto)
              importe_partida = d.unidades * producto.precio_venta
              importe_bonificacion = importe_partida * bp
              puts "Importe Partida #{importe_partida}"
              puts "Importe Bonificacion #{importe_bonificacion}"
              # volumen = cantidad * presentacion
              volumen = d.unidades * producto.presentacion_id
              puts "Volumen: #{volumen}"
              
              bd = BonificacionDetalle.new
              bd.centro_id = c.participante_id
              bd.convenio_id = c.id
              bd.operacion = BonificacionDetalle::ABONO
              bd.tipo_referencia = BonificacionDetalle::TIPO_REFERENCIA[:bonificacion_especie]
              bd.volumen = volumen
              bd.importe = importe_bonificacion
              bd.destino_id = obtener_destino_bonificacion(c.bonificaciones, producto)
              puts "Destino bonificacion #{bd.destino_id}"
              f.fecha_proceso = Time.now              
              
              BonificacionDetalle.transaction do
                bd.save!
                f.save!
             
              end

            end # if producto.precio_venta
          end # if pertenece_a_marca_bonificable?
        end
      end
    end
  end

  def obtener_destino_bonificacion(bonificaciones, producto)
    bonificaciones.each do |b|
      if b.marca_id == producto.familia_id
        return b.destino
      end
    end
    return nil
    
  end

  def porcentaje_bonificacion(bonificaciones, producto)
    bonificaciones.each do |b|
      if b.marca_id == producto.familia_id
        return Float(b.porcentaje)/100
      end
    end
    return 0.0
  end
  
  # +fecha+ actual para comparar contra termino de convenios
  # +tipo+ de participante de convenio, 1 para CDC, 2 para Corporativo
  def convenios_vigentes(fecha, tipo)
    conditions = [
      "fecha_inicio <= :fecha AND fecha_termino >= :fecha and tipo_participante = :tipo",
      {:fecha => fecha.strftime("%Y-%m-%d"), :tipo => tipo}
    ]
    
    Convenio.find(:all, :conditions => conditions)
        
  end
  
  # Encontrar facturas sin procesar en un periodo
  # +fecha_inicio+ 
  # +fecha_termino+
  def facturas_sin_procesar(centro, fecha_inicio, fecha_fin)
    conditions = [
      "fecha_factura BETWEEN :fecha_inicio AND :fecha_fin AND centro_id = :centro AND fecha_proceso IS NULL",
      {:fecha_inicio => fecha_inicio.strftime("%Y-%m-%d"), :fecha_fin => fecha_fin.strftime("%Y-%m-%d"), :centro => centro}
    ]
    
    Factura.find(:all, :conditions => conditions)
  end
  
  def pertenece_a_marca_bonificable?(producto, bonificaciones)
    bonificaciones.each do |b|
      if b.marca_id == producto.familia_id
        return true
      end
    end
    false
  end
end
